import { POSTNoLoading } from '@/api/helper'
import profile from '@root/profile'
import axios from 'axios'

const { common } = profile.proxy

export default {
  /**
   * 上传文件
   * @param data
   * @param [onUploadProgress] 上传进度回调
   * @param [signal] 中断信号
   * @param data.bucketName {string} 桶名
   * @param data.path {string} 存放路径(不能超过255个字符,且不能包含文件名)
   * @param data.file {string} 文件对象
   * @returns {Promise<{code:number,message:string,data:IMinioFile}>}
   */
  uploadFile: (data, { onUploadProgress, signal } = {}) =>
    POSTNoLoading({
      url: common.prefix + '/minio/uploadFile',
      data: data,
      headers: { 'Content-Type': 'multipart/form-data' },
      signal,
      onUploadProgress: (evt) => {
        evt.percent = evt.total > 0 ? (evt.loaded / evt.total) * 100 : 0
        onUploadProgress?.(evt)
      }
    }),

  /**
   * 尝试秒传
   * @param data
   * @param data.bucketName {string} 桶名
   * @param data.path {string} 存放路径(不能超过255个字符,且不能包含文件名)
   * @param data.md5 {string} 文件md5
   * @param data.fileName {string} 文件名
   * @returns {Promise<{code:number,message:string,data:IMinioFile}>}
   */
  tryInstantUpload: (data) => POSTNoLoading({ url: common.prefix + '/minio/tryInstantUpload', data: data }),

  /**
   * 初始化分片上传
   * @param data
   * @param [signal] {AbortSignal} 中断信号
   * @param data.bucketName {string} 桶名
   * @param data.contentType {string}  文件类型
   * @param data.fileName {string}  文件名
   * @param [data.md5] {string}  文件md5
   * @param data.partCount {string}  分片数量
   * @param data.path {string}  存放路径(不能超过255个字符,且不能包含文件名)
   * @param [data.uploadId] {string}  上传id
   * @returns {Promise<{code:number,message:string,data:{uploadId:string,uploadUrls:string[]}}>}
   */
  initMultipartUpload: (data, signal) =>
    POSTNoLoading({
      url: common.prefix + '/minio/initMultipartUpload',
      data: data,
      signal
    }),

  /**
   * 合并分片上传的文件
   * @param params
   * @param signal {AbortSignal} 中断信号
   * @param params.uploadId {string} 上传id
   * @returns {Promise<{code:number,message:string,data:IMinioFile}>}
   */
  mergeMultipartUpload: (params, signal) =>
    POSTNoLoading({
      url: common.prefix + '/minio/mergeMultipartUpload',
      params: params,
      signal
    }),

  /**
   * 分享文件
   * @param data
   * @param data.bucketName {string} 桶名
   * @param [data.expireTime] {string} 过期时间(单位:默认后台配置的时间)
   * @param data.filePath {string} 文件全路径(包含文件名的路径,但是不包含桶名)
   * @param [data.timeUnit] {string} 过期时间单位:MINUTE:分钟 HOUR:小时 DAY:天 (默认 'MINUTE'),可用值:DAY,HOUR,MINUTE,MONTH,WEEK
   * @returns {Promise<{code:number,message:string,data:string}>}
   */
  shareFile: (data) =>
    POSTNoLoading({
      url: common.prefix + '/minio/shareFile',
      data: data
    }),

  /**
   * 上传分片
   * @param url {string} 上传
   * @param data {Blob} 分片数据
   * @param [signal] 中断信号
   * @param [onUploadProgress] 上传进度回调
   * @returns {Promise<void>}
   */
  uploadPart: (url, data, { signal, onUploadProgress } = {}) =>
    axios.put(url, data, {
      headers: {
        'Content-Type': 'application/octet-stream'
      },
      signal,
      onUploadProgress: (evt) => {
        evt.percent = evt.total > 0 ? (evt.loaded / evt.total) * 100 : 0
        onUploadProgress?.(evt)
      }
    })
}
